#include <iostream>
#include <cstdlib>

int main()
{
#if 0
    // 在C语言里，malloc...free是库函数，需要加头文件，到了C++里，new...delete不用带头文件，也就意味着它不是库函数，是嵌在编译器里的关键字
    // C++对堆上内存的管理
    //  1、自行计算所需的内存大小
    //  2、返回指针不需要强转
    //  3、不需要判断返回指针为空
    // 如果申请失败，会抛出异常，而发现这个异常导致的结果，默认的是将程序终止
    // new：申请堆上空间
    int *a = new int;   // 申请int字节大小的空间
    // int *a1 = (int *)malloc(sizeof(int)); // 对比C语言里的堆上内存管理
    // if (a1 == NULL)
    // {
    // }

    *a = 10;
    std::cout << *a << std::endl;
    // 释放内存
    delete a;   // 释放指针a指向的空间
#endif

#if 0
    // 申请一维数组
    int *a = new int[10];
    for(int i = 0; i < 10; i++)
    {
        a[i] = i + 1;
        std::cout << a[i] << std::endl;
    }
    delete []a; // 是数组就要以数组的形式释放
#endif

#if 1
    // 申请二维数组
    int **a = new int *[2]; // 两个int型指针分别都指向一个堆上的数组
    for (int i = 0; i < 2; i++)
    {
        a[i] = new int[3];
    }

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            a[i][j] = i * 3 + j + 1;
        }
    }

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            std::cout << a[i][j] << " ";
        }
        std::cout << std::endl;
    }

    // 释放，先从里面开始释放
    for (int i = 0; i < 2; i++)
    {
        delete[] a[i]; // a[i]是个指针，这个指针所指向的空间是个数组，释放这个数组
    }
    delete[] a;
#endif

    return 0;
}